//
// Created by mio on 25-4-14.
//

#ifndef TCPCONNECTION_H
#define TCPCONNECTION_H

#include "BufferReader.h"
#include "BufferWriter.h"
#include "Channel.h"
#include "TcpSocket.h"
#include "TaskScheduler.h"


/**
 * @brief TcpConnection 类，代表一个 TCP 连接。
 *
 * 负责管理单个客户端连接的生命周期，包括：
 * - 数据的读取和写入缓冲。
 * - 通过 Channel 与 TaskScheduler (事件循环) 交互，处理 I/O 事件。
 * - 调用用户提供的回调函数来处理业务逻辑（如数据到达、连接断开）。
 * - 继承自 std::enable_shared_from_this 以便在成员函数中安全地获取自身的 shared_ptr。
 */
class TcpConnection : public std::enable_shared_from_this<TcpConnection>
{
public:
    using DisConnectCallback = std::function<void(std::shared_ptr<TcpConnection>)>;
    using CloseCallback = std::function<void(std::shared_ptr<TcpConnection>)>;
    using ReadCallback = std::function<bool(std::shared_ptr<TcpConnection>, BufferReader& buffer)>;

    TcpConnection(TaskScheduler* task_scheduler, int sockfd);
    virtual ~TcpConnection();

    inline TaskScheduler* GetTaskScheduler() const {return task_scheduler_; }
    inline int GetSocket() const { return channel_->GetSocket(); }

    inline void SetReadCallback(const ReadCallback& cb) { readCb_ = cb; }
    inline void SetCloseCallback(const CloseCallback& cb) { closeCb_ = cb; }
    inline void SetDisConnectCallback(const DisConnectCallback& cb) { disconnectCb_ = cb; }

    inline bool IsClosed() const { return is_closed_; }

    void Send(std::shared_ptr<char> data, uint32_t size);
    void Send(const char* data, uint32_t size);
    void DisConnect();

protected:
    // --- 事件处理函数 (由 Channel 回调) ---
    // 这些函数通常是 protected 或 private，由 Channel 触发。
    // 设为 virtual 允许派生类进行定制。

    /**
     * @brief 处理可读事件 (socket 有数据可读)。
     */
    virtual void HandleRead();
    /**
     * @brief 处理可写事件 (socket 发送缓冲区不再满)。
     */
    virtual void HandleWrite();
    /**
     * @brief 处理关闭事件 (如对方关闭连接 HUP/RDHUP)。
     */
    virtual void HandleClose();
    /**
     * @brief 处理错误事件 (socket 发生错误)。
     */
    virtual void HandleError();

private:
    void Close();

protected:
    bool is_closed_;
    TaskScheduler* task_scheduler_;                  // 指向所属的事件循环 (不拥有)
    std::unique_ptr<BufferReader> read_buffer_;
    std::unique_ptr<BufferWriter> write_buffer_;

private:
    std::mutex mtx_;
    std::shared_ptr<Channel> channel_ = nullptr;    // 管理 socket 事件的 Channel (共享拥有)
    DisConnectCallback disconnectCb_;               // 连接断开时调用 (通常给 TcpServer 用)
    CloseCallback closeCb_;                         // 连接关闭时调用 (通常给 TcpServer 用)
    ReadCallback readCb_;                           // 数据到达时调用 (给应用程序用)
};

using TcpConnectionPtr = std::shared_ptr<TcpConnection>;

#endif //TCPCONNECTION_H
